'''
Created on 2020年3月10日

@author: yinfs
'''
from dao import pcsdao
from conf import config
from bo import fileutil

class PcsBo(object):
    '''
    classdocs
    '''


    def __init__(self):
        '''
        Constructor
        '''
    
    def pcs_start(self):
        '''
        调度程序
        '''
        fu = fileutil.FileUtil()
        pdao = pcsdao.PcsDao()
        
        checkFlag = False
        #运行环境检查
        print('运行环境检查开始')
        conf_flag = self.pcs_check_conf()
        if conf_flag:
            #检查存储情况，如果无表则进行建立
            self.pcs_check_db()
            checkFlag = True        
        print('运行环境检查结束')
        
        if checkFlag:
            job_id = fu.get_uuid()
            job_extension_size = 0
            conf = config.Config()
            job_source_dirs = conf.get_config_values('DirectoryList','source_directory')
            values = job_source_dirs.split(',')
            
            for filePathName in values:
                #是否扫描过的标识
#                 directory_equal_flag = False
                
                extensionTypeList = conf.get_config_values('ExtensionType','type').split(',')
                filePathNameMd5 = fu.get_str_md5(filePathName)
                dirs_dict = fu.get_directory_photo_info(filePathName, extensionTypeList)
#                 dirs_id = fu.get_uuid()
                dirs_dict['dirs_id'] = fu.get_uuid()
                dirs_dict['source_directory'] = filePathName
                dirs_dict['source_directory_md5'] = filePathNameMd5 
                dirs_dict['job_id'] = job_id
                dirs_dict['file_repeat_size'] = 0                
                dirs_dict['repeat_percent'] = 0
                num_file_extension = dirs_dict.get('file_extension_num')
                if num_file_extension > 0:
                    job_extension_size += num_file_extension
                    #num_file_extension > 0 说明目录中存在需要扫描的文件。
                    directory_dict = pdao.get_pcs_directory_info(filePathNameMd5)
                    if directory_dict.__len__() > 0 :
                        #如果目录存在，那么就需要将DELETED 设置成1
#                         pdao.update_pcs_directory_deleted_for_id(directory_dict.get('dirs_id'))
                        
                        if dirs_dict.get('file_extension_num') != directory_dict.get('file_extension_num') or dirs_dict.get('file_extension_size') != directory_dict.get('file_extension_size'):
                            #符合条件的文件个数 或者符合条件的文件总大小 有一个不同，那么就需要重新进行扫描
                            #开始调用PCS_LOAD方法，进行文件扫描，并且将结果入库
                            #如果文件夹内的内容发生了变化，则将其删除，重新录入数据
                            pdao.delete_pcs_directory_for_dirsid(directory_dict.get('dirs_id'))
                            pdao.delete_pcs_photo_class_for_dirsid(directory_dict.get('dirs_id'))
                            self.pcs_load(dirs_dict, extensionTypeList)
                        else:
                            print('{0} 目录目前的信息与扫描过的信息一致，无需再次进行扫描，请直接查看扫描结果'.format(dirs_dict.get('source_directory')))
                            #将上一次的扫描结果的数据，重新录入一遍到数据库中。
#                             directory_dict['dirs_id'] = fu.get_uuid()
#                             directory_dict['job_id'] = job_id                            
#                             directory_list = []
#                             directory_list.append(tuple(directory_dict.values()))
#                             pdao.insert_pcs_directory(directory_list)
                            #直接将pcs_directory JOB_id更新成最新的JOB_ID
                            pdao.update_pcs_directory_jobid_for_id(job_id, directory_dict.get('dirs_id'))
                            #直接将pcs_photo_class JOB_id 更新成最新的JOB_ID
                            pdao.update_pcs_photo_class_jobid_for_dirsid(job_id, directory_dict.get('dirs_id'))
                    else:
                        self.pcs_load(dirs_dict, extensionTypeList)
            
                    #将更新每个目录的重复率
                    repeatDirsListSize = pdao.get_repeat_photo_for_directory_num(job_id, dirs_dict.get('dirs_id'))
                    if repeatDirsListSize > 0:
                        dirsPercent = round((repeatDirsListSize/dirs_dict.get('file_extension_num'))*100,2)
                        print('本次扫描的 目录名为: {0} 符合条件的文件总数:{1} 重复的文件个数为: {2} 重复率为: {3}% '.format(dirs_dict.get('source_directory'),dirs_dict.get('file_extension_num'), repeatDirsListSize,dirsPercent))
                        #将结果信息入库
                        tList = (repeatDirsListSize,dirsPercent,job_id,dirs_dict.get('dirs_id'))
                        pdao.update_pcs_directory_to_repeat(tList)
                        pdao.update_pcs_directory_log_to_repeat(tList)
                        
            #执行完成输出重复文件的信息
            self.pcs_exp(job_id,job_extension_size)
        #写入JOB表中
        job_tuple = (job_id,job_source_dirs,fu.get_str_md5(job_source_dirs))
        job_list = []
        job_list.append(job_tuple)
        pdao.insert_pcs_job(job_list)
                        
                               
    def pcs_load(self,dirs_dict,extensionTypeList):
        '''
        分类程序业务其实类
        '''
        try:
            fu = fileutil.FileUtil()
            pdao = pcsdao.PcsDao()
                             
            dirs_list = []
            dirs_list.append(tuple(dirs_dict.values()))
            pdao.insert_pcs_directory(dirs_list)
                            
            fu.get_photo_info_list_partition(dirs_dict.get('job_id'),dirs_dict.get('dirs_id'),dirs_dict.get('source_directory'), extensionTypeList)
                    
        except Exception as e:
            print('程序出现错误：',e)
    
            
    def pcs_exp(self,job_id,job_extension_size):
        '''
        将重复的数据进行输出
        '''
        try:
            #方法1，将所有的数据一次性从DB中读取出来，然后向文件中写入。
            pdao = pcsdao.PcsDao()
            repeatList = pdao.get_repeat_photo(job_id)
#             repeatListSize = repeatList.__len__()
#             percent = round((repeatListSize/job_extension_size)*100,2)
#             print('本次扫描的 符合条件的文件总数:{0} 重复的文件个数为: {1} 重复率为: {2}% '.format(job_extension_size, repeatListSize,percent))
#             #将结果信息入库
#             tList = (repeatListSize,percent,job_id)
#             pdao.update_pcs_directory_to_repeat(tList)
#             pdao.update_pcs_directory_log_to_repeat(tList)
#             print(repeatList)
#             print(repeatList.__len__())
            fu = fileutil.FileUtil()
            fu.write_csv_for_list(repeatList)
            
            #方法2，在读取DB数据的时候，就开始向文件中写入。
#             pdao = pcsdao.PcsDao()
#             pdao.get_repeat_photo_to_csv()
        except Exception as e:
            print('重复数据输出异常:',e)
            
    def pcs_check_db(self):
        '''
        检查系统的执行环境是否具备
        '''
        #检查存储系统
        pdao = pcsdao.PcsDao()
        count1 = pdao.if_tabe('pcs_photo_class')
        if count1 == 0:
           #count == 0 表示没有photo_class 表需要初始化创建。
           pdao.create_tab_photoclass()   
           
        count2 = pdao.if_tabe('pcs_directory')
        if count2 == 0:
           #count == 0 表示没有photo_class 表需要初始化创建。
           pdao.create_tab_pcs_directory()
           
        count3 = pdao.if_tabe('pcs_job')
        if count3 == 0:
           #count == 0 表示没有photo_class 表需要初始化创建。
           pdao.create_tab_pcs_job()
                
        return True  
    
    def pcs_check_conf(self):
        '''
        检查系统的配置文件信息是否齐全
        ''' 
        flag = True
        values = []
        values.append(('ExtensionType','type'))
        values.append(('DirectoryList','source_directory'))
        values.append(('DirectoryList','target_directory'))
        
        conf = config.Config()
        for v in values:
            value = conf.get_config_values(v[0], v[1])
            if value.__len__() == 0:
                flag = False
                print('congfie.ini 文件 配置有漏项，请进行检查 ',v)
#             else:
#                 fu = fileutil.FileUtil()
#                 flag = fu.if_directory(value)  
#                 if flag == False:
#                     print(value,' 目录不存在，请创建目录!')     
        return flag
          